#include "UDP.h"

// 服务器
int main(int argc, char const *argv[])
{
    ARGV_IF(argc, 3);

    int sock = 0;
    printf("%d %s", atoi(argv[2]), argv[1]);
    // struct sockaddr_in sock_add =
    UDP_Init_Sever(atoi(argv[2]), argv[1], &sock);

    // 客户端信息 
    struct sockaddr_in client_addr;
    socklen_t client_addr_len;

    // 接受请求
    file_data_str File_DATA;
    recvfrom(sock, &File_DATA, sizeof(File_DATA), 0, (struct sockaddr *)&client_addr, &client_addr_len);

    // 发送当前目录下面所有文件名
    if (File_DATA.SYN == 1)
    {
        // 打开目录
        DIR *dir = opendir("./DATA");
        // 读取目录内的文件信息
        struct dirent *dir_data;

        File_DATA.num = 0;

        while ((dir_data = readdir(dir)) != NULL)
        {
            // 收集 DATA 文件夹下的文件数量
            File_DATA.num++;
            // 收集 DATA 文件夹下的文件名
            strcat(File_DATA.buff, dir_data->d_name);
            File_DATA.buff[strlen(File_DATA.buff)] = '\n';
            File_DATA.buff[strlen(File_DATA.buff) + 1] = '\0';
        }
        // 关闭目录
        closedir(dir);

        sendto(sock, &File_DATA, sizeof(file_data_str), 0, (struct sockaddr *)&client_addr, client_addr_len);
    }

    // 接受文件名
    char file_name[128];
    recvfrom(sock, file_name, sizeof(file_name), 0, (struct sockaddr *)&client_addr, &client_addr_len);
    printf("要下载的文件为 : %s\n", file_name);

    // 发送文件 并确认 对方的信息
    char __file[128];
    int len = 0;
    sprintf(__file, "%s/%s", "./DATA", file_name);
    printf("%s\n", __file);
    int fd = open(__file, O_RDONLY);
    OPEN_ERR(fd);

    while (1)
    {
        memset(&File_DATA, 0, sizeof(File_DATA));

        while ((File_DATA.num = read(fd, File_DATA.buff, sizeof(File_DATA.buff))) > 0)
        {

            // 发送
            sendto(sock, &File_DATA, sizeof(file_data_str), 0, (struct sockaddr *)&client_addr, client_addr_len);

            // 验证上次发送是否成功

            recvfrom(sock,  &File_DATA , sizeof(File_DATA), 0, (struct sockaddr *)&client_addr, &client_addr_len);
            printf("服务器 :%d %d \n" , File_DATA.num , len);
            if (len != File_DATA.num)
            {
                printf("发送出错\n");
            }
            
            if (1024 > File_DATA.num)
            {
                printf("发送完成\n");
                break;
            }
        }
    }

    // 释放 UDP
    UDP_close(sock);
    return 0;
}



